package com.tedu.review.day02;

/**
 * 普通类
 * 抽象类=抽象方法     关键字   abstract
 * 只有行为的概念，没有具体的实现行为
 *
 * 与面对对象的多态有绝对关系
 * 产生子类【实现类】同时具备实现的属性和方法
 *
 * 什么情况下使用
 * 复杂项目时，需要在不同类中实现不同功能，首选抽象类【Android常用】
 *
 * 定义抽象类：
 * 修饰符 abstract class 类名{}    抽象类本身没有任何意义
 * 创建抽象类同时必须存在抽象方法
 * 修饰符 abstract 返回值 方法名（）;  定义抽象的方法，提供给子类使用
 *
 * 抽象类实例化：
 * 必须使用多态，向上造型，自身无法实例化，子类【实现化】
 *
 * 定义    使用     注意
 *
 * 抽象类使用注意：抽象类和抽象方法必须使用abstract关键字修饰
 *               可以定义静态方法需要加空{}，静态属性，不可以定义抽象属性
 *               可以存在构造器，不可以定义静态抽象方法，抽象静态属性
 *               可以存在内部类，静态内部类 抽象类继承抽象类
 *               Java只允许单继承，实现只需要继承子抽象类
 *               final不能修饰抽象方法
 */
abstract class Animals{       //1.可以使用static修饰 √
   //类的定义：修饰符 [abstract/ static] class 类名{}
   public abstract void say(); //抽象方法：没有任何实现
   //2.定义修饰final[锁死]的抽象方法  ×
   //public final abstract void sleep();
   //3.定义抽象属性×/定义静态属性√
   //abstract int i;//抽象
   //static int i;   //声明未赋值   静态属性
   //4.定义抽象静态属性  ×
   //abstract static int j;
   //5.定义静态抽象方法   ×   语法：修饰符[static abstract] 返回值 方法名
   //public static abstract  void eat();
   //6.定义静态方法   √   需要加代码块{}     {}一定为空的   实现类不需要一定实现
   //public static void eat(){};
   //7.可以存在内部类,可以存在静态内部类  √
   //public static class Sos{}
   //8.抽象类构造器--  √
   //public Animals() {}
}
   //9.抽象类可以继承抽象类   √
   //abstract class Thing extends Animals{
   //成员变量
      //protected abstract int result();
   //}
//实现类：子类  继承 抽象类 完成：抽象类方法
   //10.实现类【子类】继承两个抽象类  ×  但是，可以实现最终继承【子】抽象类
class People extends Animals{
   public void say() {
      System.out.println("人---说话");
   }
}
//实现类:假设Animals  有两个抽象方法  请问：子类需要实现抽象类的全部抽象方法
class Monkey extends Animals{
   public void say() {
      System.out.println("候---说话");
   }
}
public class 抽象类 {
   public static void main(String[] args) {
      //抽象---实例化【创建对象:不能直接创建】---多态：向上造型
      Animals a=new People();
       a.say();//输出：重写后的值【方法互通】
      //实现抽象类实例化
      Animals a1=new Monkey();
      a1.say();//输出：重写后的值【方法互通】

   }
}
